package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanFattura;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquisto;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanRiepilogo;
import it.azienda.managerworkstandard.modello.BeanScontrino;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.hibernate.Query;
import org.hibernate.Session;

public class DettaglioRiepilogo extends Dettaglio{
    
    private HtmlForm form = new HtmlForm();
    private BeanRiepilogo beanRiepilogo = new BeanRiepilogo();
    private java.sql.Date dataDa;
    private java.sql.Date dataA;
    
    private ArrayList listaFattureVendita = new ArrayList();
    private ArrayList listaScontrini = new ArrayList();
    private ArrayList listaFattureAcquisto = new ArrayList();
    
    public void setBeanRiepilogo(BeanRiepilogo beanRiepilogo) {
        setObj(beanRiepilogo);
        this.beanRiepilogo = beanRiepilogo;
    }
    
    public BeanRiepilogo getBeanRiepilogo(){
        return (BeanRiepilogo)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanRiepilogo =(BeanRiepilogo) ctx.getExternalContext().getRequestMap().get("beanRiepilogo");
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void entra(ActionEvent ae) {
        pulisci();
        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        java.sql.Date  data = new java.sql.Date(System.currentTimeMillis());
        String[] splitData = data.toString().split("-");
        Integer anno=login.getAnnoGestione();
        Integer mese=new Integer(splitData[1].toString());
        
        this.dataDa = java.sql.Date.valueOf(anno.toString()+"-01-01");
        this.dataA = java.sql.Date.valueOf(anno.toString()+"-12-31");
        
        try{
            beanRiepilogo.setDataA(this.dataA);
            beanRiepilogo.setDataDa(this.dataDa);
            calcolaDati();
            Utilita.getRequest().setAttribute("beanRiepilogo",beanRiepilogo);
            
        }catch(Exception ex){
            ex.printStackTrace();
            System.out.println("Errore"+ex);
        }finally {
            DAOConnectionSingleton.closeSession();
        }
        
        String url2 = "/dettaglioRiepilogo.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public void calcolaDati() throws DAOException{
        Session session = session = DAOConnectionSingleton.newSession();
        Query q = null;
        
        // Numero prodotti
        String query="select count(prodottiDett.codice) " +
                " from BeanProdottoDett prodottiDett" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        java.lang.Long risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setProdottiDett(new Integer(risultato.intValue()));
        
        // Numero clienti
        query="select count(clienti.codice) " +
                " from BeanCliente clienti" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setClienti(new Integer(risultato.intValue()));
        
        // Numero fornitori
        query="select count(fornitori.codice) " +
                " from BeanFornitore fornitori" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setFornitori(new Integer(risultato.intValue()));
        
        // Numero Categorie Clienti
        query="select count(categorieCli.codice) " +
                " from BeanCategoriaCli categorieCli" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setCategoriaClienti(new Integer(risultato.intValue()));
        
        // Numero Categorie Fornitori
        query="select count(categorieFor.codice) " +
                " from BeanCategoriaFor categorieFor" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setCategoriaFornitori(new Integer(risultato.intValue()));
        
        // Numero Famiglie Prodotti
        query="select count(prodotti.codice) " +
                " from BeanProdotto prodotti" ;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query);
        risultato = (java.lang.Long)q.uniqueResult();
        DAOConnectionSingleton.commitTransaction();
        beanRiepilogo.setFamiglieProdotti(new Integer(risultato.intValue()));
        
        // Selezione fatture vendita
        query="select fatture from BeanFattura fatture" +
                " where fatture.data between :dataDa and :dataA";
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        listaFattureVendita=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        Double imponibileFattVendita=new Double(0);
        Double ivaFattVendita=new Double(0);
        for(int i=0; i<listaFattureVendita.size(); i++){
            BeanFattura beanFattura=(BeanFattura)listaFattureVendita.get(i);
            imponibileFattVendita= new Double(imponibileFattVendita.doubleValue() + beanFattura.getImponibile().doubleValue());
            ivaFattVendita= new Double(ivaFattVendita.doubleValue() + beanFattura.getIva().doubleValue());
        }
        beanRiepilogo.setFattureVendita(listaFattureVendita.size());
        beanRiepilogo.setImponibileFattura(arrotonda(imponibileFattVendita,2));
        beanRiepilogo.setIvaFattura(arrotonda(ivaFattVendita,2));
        
        // Selezione scontrini
        query="select scontrini from BeanScontrino scontrini" +
                " where scontrini.data between :dataDa and :dataA";
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        listaScontrini=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        Double imponibileScontrini=new Double(0);
        Double ivaScontrini=new Double(0);
        for(int i=0; i<listaScontrini.size(); i++){
            BeanScontrino beanScontrino=(BeanScontrino)listaScontrini.get(i);
            imponibileScontrini= new Double(imponibileScontrini.doubleValue() + beanScontrino.getImponibile().doubleValue());
            ivaScontrini= new Double(ivaScontrini.doubleValue() + beanScontrino.getIva().doubleValue());
        }
        beanRiepilogo.setScontrini(listaScontrini.size());
        beanRiepilogo.setImponibileScontrino(arrotonda(imponibileScontrini,2));
        beanRiepilogo.setIvaScontrino(arrotonda(ivaScontrini,2));
        
        // Selezione Fatture acquisto
        query="select fattureAcquisto from BeanFatturaAcquisto fattureAcquisto" +
                " where fattureAcquisto.data between :dataDa and :dataA";
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        listaFattureAcquisto=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        Double imponibileFattAcquisto=new Double(0);
        Double impostaFattAcquisto=new Double(0);
        for(int i=0; i<listaFattureAcquisto.size(); i++){
            BeanFatturaAcquisto beanFattAcquisto=(BeanFatturaAcquisto)listaFattureAcquisto.get(i);
            imponibileFattAcquisto= new Double(imponibileFattAcquisto.doubleValue() + beanFattAcquisto.getImponibile().doubleValue());
            impostaFattAcquisto= new Double(impostaFattAcquisto.doubleValue() + beanFattAcquisto.getImposta().doubleValue());
        }
        beanRiepilogo.setFattureAcquisto(listaFattureAcquisto.size());
        beanRiepilogo.setImponibileFattAcquisto(arrotonda(imponibileFattAcquisto,2));
        beanRiepilogo.setImpostaFattAcquisto(arrotonda(impostaFattAcquisto,2));
        
        
    }
    
    public void calcolaNuovoPeriodoRiepilogo(){
        Utilita.getRequest().removeAttribute("form");
        beanRiepilogo=(BeanRiepilogo)Utilita.getRequest().getAttribute("beanRiepilogo");
        dataDa = new java.sql.Date( beanRiepilogo.getDataDa().getTime());
        dataA = new java.sql.Date( beanRiepilogo.getDataA().getTime());
        
        beanRiepilogo.setImponibileFattura(new Double(0));
        beanRiepilogo.setIvaFattura(new Double(0));
        beanRiepilogo.setImponibileScontrino(new Double(0));
        beanRiepilogo.setIvaScontrino(new Double(0));
        beanRiepilogo.setImponibileFattAcquisto(new Double(0));
        beanRiepilogo.setImpostaFattAcquisto(new Double(0));
        
        try{
            calcolaDati();
            Utilita.getRequest().setAttribute("beanRiepilogo",beanRiepilogo);
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }
        
        String url2 = "/dettaglioRiepilogo.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public Double arrotonda(Object obj,int precisione){
        Double valore=(Double)obj;
        Double valoreArr=new Double(0);
        double pot = Math.pow(10, precisione);
        double  v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }
    
    public String calcolaMese(int mese){
        String meseSt="";
        switch(mese){
            case 1: meseSt="GENNAIO"; break;
            case 2: meseSt="FEBBRAIO"; break;
            case 3: meseSt="MARZO"; break;
            case 4: meseSt="APRILE"; break;
            case 5: meseSt="MAGGIO"; break;
            case 6: meseSt="GIUGNO"; break;
            case 7: meseSt="LUGLIO"; break;
            case 8: meseSt="AGOSTO"; break;
            case 9: meseSt="SETTEMBRE"; break;
            case 10: meseSt="OTTOBRE"; break;
            case 11: meseSt="NOVEMBRE"; break;
            case 12: meseSt="DICEMBRE"; break;
            default: meseSt="";
            break;
        }
        return meseSt;
    }
    
    public void pulisci(){
        HttpSession sessione = (HttpSession)Utilita.getSession();
        HttpServletRequest richiesta =(HttpServletRequest)Utilita.getRequest();
        
        sessione.removeAttribute("form");
        sessione.removeAttribute("posizioneOggetto");
        sessione.removeAttribute("beanFind");
    }
}